package com.rslai.commons.validator.jsonvalidator.validate;

import com.alibaba.fastjson.JSON;
import com.rslai.commons.validator.jsonvalidator.JsonSchema;
import com.rslai.commons.validator.jsonvalidator.schema.Schema;
import com.rslai.commons.validator.jsonvalidator.util.ReaderUtil;

import java.io.InputStream;
import java.io.Reader;
import java.net.URL;

/**
 * Json验证接口的javaCC实现类
 */
public class JavaCCSchema implements JsonSchema {
    private Schema<Object> schema;

    /**
     * 构造函数
     * @param schema schema
     */
    public JavaCCSchema(Schema<Object> schema) {
        this.schema = schema;
    }

    /**
     * Json验证，string类型
     * @param json json string
     */
    @Override
    public void validate(String json) {
        Object jsonObject = parse(json);
        schema.validate("$", jsonObject);
    }

    /**
     * Json验证，InputStream类型
     * @param jsonStream json Stream
     */
    @Override
    public void validate(InputStream jsonStream) {
        validate(ReaderUtil.reader(jsonStream));
    }

    /**
     * Json验证，Reader类型
     * @param jsonReader json Reader
     */
    @Override
    public void validate(Reader jsonReader) {
        validate(ReaderUtil.reader(jsonReader));
    }

    /**
     * Json验证，URL类型
     * @param jsonURL json URL
     */
    @Override
    public void validate(URL jsonURL) {
        validate(ReaderUtil.reader(jsonURL));
    }

    /**
     * JSON解析
     * @param json
     * @return
     */
    private Object parse(String json) {
        try {
            return tryParse(json);
        } catch (Exception e) {
            return tryParse(String.format("\"%s\"", json));
        }
    }

    /**
     * JSON解析
     * @param json
     * @return
     */
    private Object tryParse(String json) {
        try {
            return JSON.parse(json);
        } catch (Exception e) {
            throw new RuntimeException("接口返回的json语法错误，请检查:" + e.getMessage(), e);
        }
    }
}
